服务调用/通信 您所在的位置:网站首页 openfeign feignclient 服务调用/通信

服务调用/通信

#服务调用/通信| 来源: 网络整理| 查看: 265

Spring Cloud OpenFeign 它是 Spring 官方推出的一种声明式服务调用与负载均衡组件。它底层基于 Netflix Feign,Netflix Feign 是 Netflix 设计的开源的声明式 WebService 客户端,用于简化服务间通信。

Spring Cloud openfeign 对 Feign 进行了增强,使其支持 Spring MVC 注解,另外还整合了 Ribbon 和 Nacos,从而使得 Feign 的使用更加方便。

https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/原理

用到了动态代理

对比 Dubbo

OpenFeign 好像不能直接调用 service 层,一般的写法是服务提供方必须写 controller 接口,而 dubbo 是不用写 controller 接口的。如果不能直接调用 service 层,必须写 controller 层,那么这应该是一个缺点,因为每次都额外要写一个 controller 方法。

而且在服务消费者方,还要额外写个有@FeignClient注解的远程调用 service 接口。看上去 Spring Cloud 的OpenFeign比dubbo麻烦不少。

引入依赖

使用 OpenFeign 组件需要引入客户端依赖

org.springframework.cloud spring-cloud-starter-openfeign 复制代码使用案例

在启动类上加上@EnableFeignClients注解

/** * 被调用方 */ @RestController public class WarehouseController { /** * 查询对应 skuId 的库存状况 * @param skuId skuId * @return Stock 库存对象 */ @GetMapping("/stock") public Stock getStock(Long skuId){ // ...省略 } } /** * 调用方 */ @FeignClient("warehouse-service") public interface WarehouseServiceFeignClient { @GetMapping("/stock") public Stock getStock(@RequestParam("skuId") Long skuId); } 复制代码

@FeignClient 注解说明当前接口为 OpenFeign 通信客户端,参数值 warehouse-service 为服务提供者 ID(注意,OpenFeign服务名称不支持下划线_,这是一个坑),这一项必须与 Nacos 注册 ID 保持一致。

在 OpenFeign 发送请求前会自动在 Nacos 查询 warehouse-service 所有可用实例信息,再通过内置的 Ribbon 负载均衡选择一个实例发起 RESTful 请求,进而保证通信高可用。

tips: 这里的返回值虽然写的都是同一个类型,但他们可不一定是同一个类,本质上是以 Json 交互的,只要属性对的上即可。

@FeignClient 注解属性详解

contextId: 如果配置了contextId,该值将会作为beanName。

fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口

fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码

url: url一般用于调试,可以手动指定@FeignClient调用的地址

Spring Cloud CircuitBreaker Fallbacks

当断路器打开或出现错误时执行的默认逻辑,可以通过fallback来配置

注意:您还需要将其声明为Spring bean。

@FeignClient(name = "test", url = "http://localhost:${server.port}/", fallback = Fallback.class) protected interface TestClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") Hello getHello(); @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound") String getException(); } @Component static class Fallback implements TestClient { @Override public Hello getHello() { throw new NoFallbackAvailableException("Boom!", new RuntimeException()); } @Override public String getException() { return "Fixed response"; } } 复制代码

如果需要访问导致回退触发的原因,可以使用fallbackFactory属性

@FeignClient(name = "testClientWithFactory", url = "http://localhost:${server.port}/", fallbackFactory = TestFallbackFactory.class) protected interface TestClientWithFactory { @RequestMapping(method = RequestMethod.GET, value = "/hello") Hello getHello(); @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound") String getException(); } @Component static class TestFallbackFactory implements FallbackFactory { @Override public FallbackWithFactory create(Throwable cause) { return new FallbackWithFactory(); } } static class FallbackWithFactory implements TestClientWithFactory { @Override public Hello getHello() { throw new NoFallbackAvailableException("Boom!", new RuntimeException()); } @Override public String getException() { return "Fixed response"; } } 复制代码开启日志

工作中我们有些生产问题出现在微服务 OpenFeign 的互相调用中,然而 OpenFeign 的调用默认是不打日志的。

我们可以通过代码配置或者配置文件配置

//全局配置 @Configuration public class FeignLoggerConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } //局部配置 //不需要加Configuration注解 public class FeignConfig { @Bean public Logger.Level feignLogLevel(){ //设置feign客户端的日志打印级别为FULL return Logger.Level.FULL; } } //configuration属性,值为Class,配置信息对名称为userprivilege的服务生效 @Resource @FeignClient(name="userprivilege",fallback = FallBack_PrivilegeService.class ,configuration = FeignConfig.class) public interface PrivilegeService { } 复制代码 feign: client: config: default: # 项目全局 loggerLevel: HEADERS order-service: #@FeignClient注解中配置的服务名 loggerLevel: FULL 复制代码

Level 有四个等级

NONE 不打日志,默认值BASIC 只记录 method、url、响应码,执行时间HEADERS 只记录请求和响应的 headerFULL 全部都记录

上面修改了 openfeign 的日志级别是 debug,但是 springboot 默认日志级别是 info,因为 debug



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有